home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 4 / QRZ Ham Radio Callsign Database - Volume 4.iso / files / dsp / 56ktools / dspkgctr.z / dspkgctr / gcc / va-mips.h < prev    next >
C/C++ Source or Header  |  1992-06-08  |  4KB  |  115 lines

  1. /* ---------------------------------------- */
  2. /*           VARARGS  for MIPS/GNU CC       */
  3. /*                                          */
  4. /*                                          */
  5. /*                                          */
  6. /*                                          */
  7. /* ---------------------------------------- */
  8.  
  9. /* WARNING: THIS depends heavily on in register parameter
  10.    passing conventions of the MIPS.  This is compatible with MIPS
  11.    programs, including printf; but differs from MIPS
  12.    implementation. */
  13.  
  14. /*            PROLOGUE FOR VARARGS PROGRAMS:
  15.           
  16.                                         ;;;; META COMMENTS
  17.       .align 0
  18.                                         ;;;; Purpose: identify varargs pgm
  19.                                         ;;;; to codegen. I'd rather have a
  20.                     ;;;; Flag in the compiler than this.
  21.  
  22. __vd_alist.0:
  23.       .ascii "__%%VARARGS\0"
  24.       .ent    zrintf
  25. zrintf:
  26.  #PROLOGUE
  27.       add     $8,$0,$29
  28.                                         ;;;; Leave extra space in frame
  29.                     ;;;; to save f12 f14
  30.       subu    $29,112 #temp=   76,saveregs=   32, sfo=   -4
  31.  #    .mask   0xc0010000
  32.       sw      $31,4($29)
  33.       sw      $30,8($29)
  34.                                         ;;;; Purpose:save stack size on stack
  35.                                         ;;;; for easier retrieval
  36.       addi    $9,$0,112       #Varargs suspicion
  37.       sw      $9,-4($8)       #Varargs suspicion
  38.                                         ;;;; save floating point registers
  39.                                         ;;;; into extra stack space (in the
  40.                     ;;;; varargs callee frame, NOT in the
  41.                     ;;;; space saved by caller for register
  42.                     ;;;; argument write back. Thus, we
  43.                     ;;;; can write back both, and let the
  44.                     ;;;; va_arg macro decide what is
  45.                     ;;;; required.
  46.  
  47.       s.d     $f12,16($29)    #Varargs Suspicion
  48.       s.d     $f14,24($29)    #Varargs Suspicion
  49.  
  50.       sw      $16,28($29)
  51.  #    .fmask  0x0
  52.       add     $30,$0,$8
  53.  #END PROLOGUE
  54.                                         ;;;; Write back of r4-r7 due to
  55.                     ;;;; the va_dcl, va_start combination
  56.  
  57.       sw      $4,0($30)       #movsi $4 -> 0($30)
  58.       sw      $5,4($30)       #movsi $5 -> 4($30)
  59.       sw      $6,8($30)       #movsi $6 -> 8($30)
  60.       sw      $7,12($30)      #movsi $7 -> 12($30)
  61.   
  62. */
  63.  
  64. typedef struct 
  65. { int pnt;
  66.   char *stack;
  67.   double *fpregs;  
  68.    } va_list  ;
  69.                 /* Used to push R4-R7 to stack  */
  70.                 /* and to access argument list on stack */
  71. #define va_alist _va_alist, __va_alist,__vb_alist,__vc_alist
  72.  
  73. #define va_dcl int _va_alist, __va_alist,__vb_alist,__vc_alist; 
  74.  
  75.  
  76. #define va_start(list) {\
  77.        static char __vd_alist[16] = "__%%VARARGS";  /* Identify to codegen */\
  78.        &__va_alist,&__vb_alist,&__vc_alist,         /* write back to stack */\
  79.        (list).pnt = 0,                              /* start from first    */\
  80.        (list).stack =  (char *) &_va_alist,         /* Access parameter list*/\
  81.        (list).fpregs =  (double *)((list).stack -\
  82.                    *(int *)((list).stack -4) +  16),       \
  83.        (list).stack;}         
  84.  
  85. #define va_end(list)
  86.  
  87.                 /* For argument passing convention see */
  88.                 /* both tm.h and Jerry Kane's book     */
  89.  
  90. #define va_arg(list,mode) (((mode *)\
  91.               (((sizeof(mode) > 4) ?\
  92.             (((list).pnt == 0 )?(((list).pnt = -1),\
  93.                        (list).stack = (char *)\
  94.                                        (((int)((list).stack)\
  95.                               + 2*8 - 1) & -8),\
  96.                        (char *)((list).fpregs+1)\
  97.                        )\
  98.                  :((list).pnt == -1) ?((list).pnt = 2,\
  99.                        (list).stack = (char *)\
  100.                                   (((int)((list).stack)\
  101.                               + 2*8 - 1) & -8),\
  102.                        (char *)((list).fpregs+2) \
  103.                        )\
  104.                         :(((list).pnt > 0 )?\
  105.                 ((list).pnt =((list).pnt +1),\
  106.                                                 (list).stack =(char *)\
  107.                            (((int)((list).stack)\
  108.                               + 2*8 - 1) & -8) \
  109.                         ):(char *)abort()))\
  110.         :((list).pnt = (((list).pnt >=0) ? ((list).pnt +1)\
  111.                                 :((list).pnt == -1) ? 2 :3),\
  112.          (list).stack =  (char *)(((int)((list).stack)+ 2*4 - 1) & -4)\
  113.         )\
  114.         )))[-1])\
  115.